﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DAO;
using System.Data.SqlClient;
using Entidad;
namespace DAO
{

   public class DetalleFacturaDAO
    {
       private DAO_v2 dao;
       public DetalleFacturaDAO()
        {
            dao = new DAO_v2();
            
        }
        public string CadenaConexion()
        {
            return dao.StringConexion();
        }
        public bool GuardarDetalle(DetalleFacturaEnt detalle, SqlTransaction tran, int id_Factura, int id_Usuario, SqlConnection con)
        {
            try
            {
            SqlCommand cmd = new SqlCommand();
         

            List<String> parametros = new List<String>();
            List<Object> datos = new List<Object>();
            parametros.Add("id_Factura");
            datos.Add(id_Factura);
            parametros.Add("id_Ejemplar");
            datos.Add(detalle.id_Ejemplar);
            parametros.Add("id_Usuario");
            datos.Add(id_Usuario); // Se lo paso desde la factura... Me parece que este id no iria en detalle...
            parametros.Add("precio");
            if (detalle.precio > 0)
             {
                 datos.Add(detalle.precio);
              }
            else
            {
                datos.Add(DBNull.Value);
            }
           
            cmd = dao.Grabar("DetalleFactura",parametros, datos);
            cmd.Connection = con;
            cmd.Transaction = tran;
            cmd.ExecuteNonQuery();
            
            //Actualizo el estado del ejemplar...
            cmd.CommandText = "UPDATE Ejemplar SET disponibilidad = @disponibilidad WHERE Ejemplar.id_Ejemplar = @idEjm";
            cmd.Parameters.AddWithValue("@idEjm", detalle.id_Ejemplar);
            cmd.Parameters.AddWithValue("@disponibilidad", false);
            cmd.ExecuteNonQuery();

            return true;
            }
            catch (SqlException ex)
            {
                tran.Rollback();
                return false;
                throw new ApplicationException();
            }

           

        }
        public bool ActualizarDetalle(DetalleFacturaEnt detalle, SqlTransaction tran, int id_Factura, int id_Usuario, SqlConnection con)
        {
            try
            {
                SqlCommand cmd = new SqlCommand();


                List<String> parametrosSet = new List<String>();
                List<Object> datosSet = new List<Object>();
                List<String> parametrosWhere = new List<String>();
                List<Object> datosWhere = new List<Object>();
                parametrosSet.Add("id_Ejemplar");
                datosSet.Add(detalle.id_Ejemplar);
                parametrosSet.Add("id_Usuario");
                datosSet.Add(id_Usuario); // Se lo paso desde la factura... Me parece que este id no iria en detalle...
                parametrosSet.Add("precio");
                if (detalle.precio > 0)
                {
                    datosSet.Add(detalle.precio);
                }
                else
                {
                    datosSet.Add(DBNull.Value);
                }
                parametrosWhere.Add("id_DetalleFactura");
                datosWhere.Add(detalle.id_DetalleFactura);
                cmd = dao.Actualizar("DetalleFacturaDAO",parametrosSet,datosSet,parametrosWhere,datosWhere);
                cmd.Connection = con;
                cmd.Transaction = tran;
                cmd.ExecuteNonQuery();

                return true;
            }
            catch (SqlException ex)
            {
                tran.Rollback();
                return false;
                throw new ApplicationException("Error al actualizar el detalle");
            }



        }
        public void EliminarDetalle(DetalleFacturaEnt detalle, SqlTransaction tran, SqlConnection con) //Actualiza estado ejemplares
        {
            try
            {
                List<String> parametrosWhere = new List<String>();
                List<Object> datosWhere = new List<Object>();
                //parametrosWhere.Add("id_DetalleFactura");
                //datosWhere.Add(detalle.id_DetalleFactura);
                SqlCommand cmd = new SqlCommand();
                //cmd = dao.Eliminar("DetalleFactura", parametrosWhere, datosWhere);
                cmd.Connection = con;
                cmd.Transaction = tran;
                //cmd.ExecuteNonQuery();

                //Actualizo el estado del ejemplar...
                cmd.CommandText = "UPDATE Ejemplar SET disponibilidad = @disponibilidad WHERE Ejemplar.id_Ejemplar = @id_Ejemplar";
                cmd.Parameters.AddWithValue("@id_Ejemplar", detalle.id_Ejemplar);
                cmd.Parameters.AddWithValue("@disponibilidad", true);
                cmd.ExecuteNonQuery();
            }
            catch (SqlException)
            {
                tran.Rollback();
                throw new ApplicationException("Error al actualizar el detalle");
            }
        }

       public List<DetalleFacturaEnt> ObtenerDetalles(int NroFactura)
        {
            SqlConnection con = new SqlConnection(CadenaConexion());
            try
            {   
                List<String> pk = new List<String>();
                List<String> fk = new List<String>();
                List<String> tablas = new List<String>();
                List<String> columnas = new List<String>();
                 List<String> parametrosWhere = new List<String>();
                List<Object> datosWhere = new List<Object>();
                tablas.Add("DetalleFactura DF");
                tablas.Add("Factura F");
                columnas.Add("DF.id_Ejemplar");
                columnas.Add("DF.id_Usuario");
                columnas.Add("DF.precio");
                columnas.Add("DF.id_DetalleFactura");
                columnas.Add("F.id_Factura");
                fk.Add("DF.id_Factura");
                pk.Add("F.id_Factura");
                parametrosWhere.Add("numero");
                datosWhere.Add(NroFactura);

                con.Open();
                SqlCommand cmd = new SqlCommand();
                cmd = dao.BuscarVariasTablasConFiltro(tablas, columnas, fk, pk, parametrosWhere, datosWhere);
                List<DetalleFacturaEnt> resultado = new List<DetalleFacturaEnt>();
                cmd.Connection = con;
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    DetalleFacturaEnt detalle = new DetalleFacturaEnt();
                    detalle.id_DetalleFactura = int.Parse(dr["id_DetalleFactura"].ToString());
                    detalle.id_Factura = int.Parse(dr["id_Factura"].ToString());
                    detalle.id_Ejemplar = int.Parse(dr["id_Ejemplar"].ToString());
                    detalle.id_Usuario = int.Parse(dr["id_Usuario"].ToString());
                    if(dr["precio"] != DBNull.Value)
                    { 
                    detalle.precio = decimal.Parse(dr["precio"].ToString());
                    }
                    resultado.Add(detalle);
                }
                return resultado;
            }
            catch (SqlException)
            {
              return null;
                throw new ApplicationException("Error al obtener los detalles");
            }
            finally
            {
                dao.CerrarConexion(con);

            }

        }

    }
}
